#include "Crypter.h"


mpz_t * Crypter(const char * texte, ClefPublique * clef)
{
    int taille;
    int i;
    mpz_t n;
    mpz_t c;

    mpz_init_set(n, ClefPubliqueGetn(clef));
    mpz_init_set(c, ClefPubliqueGetc(clef));

//    gmp_printf("voici la clef publique utilisée : (%Zd, %Zd) \n", n, c);

    taille=strlen(texte);
    mpz_t * resultat=NULL;
    resultat=(mpz_t *)malloc(taille*sizeof(mpz_t));
    i=0;
    while (texte[i]!='\0')
    {
        mpz_t base;
        mpz_init(resultat[i]);
        mpz_init_set_ui(base, (unsigned long int)texte[i]);
        mpz_powm(resultat[i], base, c, n);
        /* ICI*/
        mpz_clear(base);
        i++;
    }

    /* On libère nos variables */
    mpz_clear(n);
    mpz_clear(c);

   return resultat;

}


void CrypterSauver(mpz_t * resultat, const char * nomfichier, int taille)
{
    FILE * f;
    int i;
    f = fopen(nomfichier, "w");
    if (f==NULL)
    {
        printf("Erreur lors de l'ouverture de %s\n", nomfichier);
        assert( f );
    }
    fprintf(f , "Texte Crypte: \n");
    fprintf(f , "nbCaracteres: %d \n \n", taille);
    for(i=0; i<taille; i++)
    {
        assert(gmp_fprintf(f,"%Zd \n", resultat[i])>=1);
    }
    printf("Sauvegarde du texte crypté: %s ...OK\n", nomfichier);
    fclose(f);

}


void CrypterLiberer(mpz_t * resultat, int taille)
{
    int i;
    for (i=0; i<taille; i++)
    {
        mpz_clear(resultat[i]);
    }
    free(resultat);
}


void testRegressionCrypter()
{
    mpz_t a;
    mpz_t b;
    mpz_t c;
    char texte_a_crypter[30] = "Bonjour c'est un test \0";
    ClefPublique * clef;
    ClefPubliqueInitialiser(&clef);
    mpz_init_set_ui(a, (unsigned long int)436);
    mpz_init_set_ui(b, (unsigned long int)53);
    mpz_init_set_ui(c, (unsigned long int)396);
    ClefPubliqueSetn(clef, a);
    ClefPubliqueSetc(clef, b);
    ClefPubliqueSetm(clef, c);
    mpz_t * tableau;
    tableau = Crypter(texte_a_crypter, clef);
    CrypterSauver(tableau, "test_regression_crypter", strlen(texte_a_crypter) );
    ClefPubliqueLiberer(clef);
    CrypterLiberer(tableau, strlen(texte_a_crypter));
    mpz_clear(a);
    mpz_clear(b);
    mpz_clear(c);
}



